home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / os20 / util / stat.lha / stat.c < prev    next >
C/C++ Source or Header  |  1993-03-20  |  3KB  |  165 lines

  1. /*
  2.  *
  3.  * $Header$
  4.  *
  5.  */
  6.  
  7. /*
  8.  *
  9.  * Original version of this program: James M Synge, Sept. 2, 1986
  10.  * UUCP: uw-beaver!geops!uw-atm!james
  11.  *
  12.  * Rewritten for AmigaOS 2.x and beyond: Henning Schmiedehausen
  13.  * Internet: barnard@forge.franken.de
  14.  *
  15.  * SAS C 6.2
  16.  *
  17.  */
  18.  
  19.  
  20.  
  21.  
  22. #include <string.h>
  23. #include <stdio.h>
  24. #include <stdlib.h>
  25.  
  26. #include <exec/types.h>
  27. #include <exec/memory.h>
  28. #include <exec/tasks.h>
  29. #include <exec/interrupts.h>
  30.  
  31. #include <libraries/dosextens.h>
  32.  
  33. #include <clib/exec_protos.h>
  34.  
  35.  
  36. #define BUF_SIZE 256
  37.  
  38. char buf1[BUF_SIZE],
  39.      buf2[BUF_SIZE];
  40.  
  41. extern struct DosLibrary *DOSBase;
  42.  
  43. /* Need a macro to translate a BPTR to an APTR */
  44.  
  45. /*#ifdef BADDR
  46. #undef BADDR
  47. #endif
  48. #define BADDR(bptr) (((long)bptr) << 2)
  49. */
  50.  
  51. void moveBSTR(BSTR bptr, char *buffer, int maxlen);
  52.  
  53. main(argc, argv)
  54. int argc;
  55. char *argv[];
  56. {
  57.     int                             tasknum,
  58.                                  pri;
  59.     char                        *msg;
  60.     long                         process,
  61.                                  processes,
  62.                                 *ta;
  63.     struct Process                *pr;
  64.     struct RootNode                *rn;
  65.     struct CommandLineInterface    *cli;
  66.     struct CliProcList            *cl;
  67.     struct Library                *foobase;
  68.  
  69.     /* Find the RootNode */
  70.  
  71.     if(!(foobase = OpenLibrary("exec.library",37L)))
  72.     {
  73.         printf("You need AmigaOS V37 or beyond\n");
  74.         exit(20);
  75.     }
  76.     CloseLibrary(foobase);
  77.  
  78.     rn = (struct RootNode *)(DOSBase->dl_Root);
  79.  
  80.     /* Print the title line. */
  81.     printf("Task Pri  Address Command\t\t\t   Directory\n");
  82.  
  83.     for(cl = (struct CliProcList *)rn->rn_CliList.mlh_Head; cl->cpl_Node.mln_Succ ; cl = (struct CliProcList *)cl->cpl_Node.mln_Succ)
  84.     {
  85.  
  86.         /* ta points to the array of tasks. The first location is the */
  87.         /* maximum number of processes, followed by that many pointers. */
  88.         /* Each pointer points to the MsgPort within the Process data */
  89.         /* structure of each AmigaDos process, otherwise its value is 0L. */
  90.         /* The AmigaDOS Technical Reference Manual calls these pointers */
  91.         /* process ids. */
  92.  
  93.  
  94.         ta = (long *) cl->cpl_Array;
  95.  
  96.         /* How many AmigaDOS processes are there? */
  97.  
  98.         processes = *ta++;
  99.  
  100.         /* Loop through each live process, printing info. */
  101.  
  102.         for (process = 0; process < processes; process++ )
  103.         {
  104.  
  105.             /* Get the next process id (i.e. struct MsgPort *) */
  106.  
  107.             msg = (char *)(*ta++);
  108.             if(!msg)
  109.                 continue; /* No associated Process? */
  110.  
  111.             pr = (struct Process *)(msg - sizeof(struct Task));
  112.             tasknum = (int)(pr->pr_TaskNum);
  113.             pri = (int)(pr->pr_Task.tc_Node.ln_Pri);
  114.  
  115.             cli = (struct CommandLineInterface *) BADDR(pr->pr_CLI);
  116.  
  117.             if(cli)
  118.             {
  119.                 moveBSTR(cli->cli_CommandName, buf1, BUF_SIZE);
  120.                 if(!buf1[0])
  121.                     strcpy(buf1, "Waiting for a command");
  122.                 moveBSTR(cli->cli_SetName, buf2, BUF_SIZE);
  123.  
  124.             }
  125.             else
  126.             {
  127.                 strcpy(buf1, "Not a CLI");
  128.                 buf2[0] = 0;
  129.             }
  130.  
  131.             printf("%3d %4d %8lx %-32s %s\n",tasknum, pri, pr, buf1, buf2);
  132.         }
  133.     }
  134.     exit(0);
  135. }
  136.  
  137. /* moveBSTR copies a BSTR to a C char string. */
  138.  
  139. void moveBSTR(BSTR bptr, char *buffer, int maxlen)
  140. {
  141.     register char            *ptr;
  142.     register unsigned int     len,
  143.                              i;
  144.     unsigned char             l;
  145.  
  146.     ptr = (char *)BADDR(bptr);
  147.  
  148.     l = (unsigned int) (*ptr++);
  149.  
  150.     if (!(len = l))
  151.     {
  152.         *buffer = '\0';
  153.         return;
  154.     }
  155.     if (len > maxlen)
  156.         len = maxlen;
  157.     for(i = 0; i < len; i++)
  158.         *buffer++ = *ptr++;
  159.  
  160.     if (i < maxlen)
  161.         *buffer = '\0'; /* If there is room, mark the end */
  162.     return;
  163. }
  164.  
  165.